package br.unidocs.web.bean;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.component.UIData;

import br.unidocs.modelo.entidade.Arquivo;
import br.unidocs.modelo.entidade.Tag;
import br.unidocs.servico.ArquivoEJB;

public class GerenciaArquivoBackingBean {
	private List<Arquivo> arquivos = null;

	@EJB
	// falamos para o servidor, crie e insira aqui, para nao criar na mao;
	private ArquivoEJB arquivoEjb;

	private UIData tabelaArquivos;

	// Variaveis para exclusao de arquivo
	private Arquivo arquivoParaExclusao;

	// Variaveis para selecao de arquivo
	private Arquivo arquivoSelecionado;

	private String tags;

	public List<Arquivo> getArquivos() {
		if (arquivos == null) {
			arquivos = arquivoEjb.listaArquivos();
		}
		return arquivos;
	}

	public String selecionaArquivoParaAlteracao() {
		arquivoSelecionado = (Arquivo) tabelaArquivos.getRowData();
		// junta todas as tags numa string unica
		tags = "";
		for (Tag tag : arquivoSelecionado.getTags()) {
			tags += tag.getNome() + ";";
		}

		return "alterarArquivo";
	}

	public String alteraArquivo() {
		// processa a alteração das tags
		List<Tag> tagsARemover = new ArrayList<Tag>();
		List<Tag> tagsAAdicionar = new ArrayList<Tag>();
		tagsARemover.addAll(arquivoSelecionado.getTags());
		String[] arrayTags = tags.split("[;,]");
		for (String novaTag : arrayTags) {
			Boolean jaPossuiTag = false;
			for (Tag tagArquivo : arquivoSelecionado.getTags()) {
				if (tagArquivo.getNome().equals(novaTag)) {
					// Como o arquivo continua com essa tag, remove a tag da
					// lista de futuras exclusões
					tagsARemover.remove(tagArquivo);
					jaPossuiTag = true;
					break;
				}
			}
			if (!jaPossuiTag) {
				// Como trata-se de uma nova tag, adiciona-a na lista
				Tag tag = new Tag();
				tag.setNome(novaTag);
				tagsAAdicionar.add(tag);
			}
		}

		arquivoEjb.atualizaArquivo(arquivoSelecionado, tagsAAdicionar,
				tagsARemover);
		arquivos = null;
		return "voltar";
	}

	public String confirmaExclusao() {
		arquivoParaExclusao = (Arquivo) tabelaArquivos.getRowData();
		return "confirmaExclusaoArquivo";
	}

	public String excluiArquivoSelecionado() {
		// Chama o servico de exclusao
		arquivoEjb.excluiArquivo(arquivoParaExclusao);
		return "voltar";
	}

	public String selecionaArquivoParaDetalhamento() {
		arquivoSelecionado = (Arquivo) tabelaArquivos.getRowData();
		arquivoSelecionado = arquivoEjb
				.localizaArquivoParaDetalhamento(arquivoSelecionado.getId());
		tags = "";
		for (Tag tag : arquivoSelecionado.getTags()) {
			tags += tag.getNome() + ";";
		}
		return "detalheArquivo";
	}

	public UIData getTabelaArquivos() {
		return tabelaArquivos;
	}

	public void setTabelaArquivos(UIData tabelaArquivos) {
		this.tabelaArquivos = tabelaArquivos;
	}

	public void setArquivos(List<Arquivo> arquivos) {
		this.arquivos = arquivos;
	}

	public Arquivo getArquivoParaExclusao() {
		return arquivoParaExclusao;
	}

	public void setArquivoParaExclusao(Arquivo arquivoParaExclusao) {
		this.arquivoParaExclusao = arquivoParaExclusao;
	}

	public Arquivo getArquivoSelecionado() {
		return arquivoSelecionado;
	}

	public void setArquivoSelecionado(Arquivo arquivoSelecionado) {
		this.arquivoSelecionado = arquivoSelecionado;
	}

	public String getTags() {
		return tags;
	}

	public void setTags(String tags) {
		this.tags = tags;
	}

}
